<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>数据类型的分类</title>
</head>

<body>
  <script>
    // var a = 100;
    // var b = "hhhhh"
    // 1.基本数据类型的判断
    /*    console.log(typeof a); //number
       console.log(typeof b); // string
       console.log(typeof true); //boolean
       console.log(typeof undefined); //undefined
       console.log(typeof null); //object
       console.log(typeof {});  //object
       console.log(typeof []); //object
       console.log(typeof NaN); //number
       console.log(typeof function () { }); //function
   
       //2. 判断是不是NaN?
       console.log(isNaN(NaN)); //true
       console.log(isNaN(44)); //false */

    // 3. 基本数据类型： string  number  boolean undefined null
    //  es6:  (bigint、symbol)
    // 引用数据类型   function Object Array

    // 4.symbol的意思是独一无二的一个值,可以通过一个相同的字符串，来创建不同的变量。
    // 创建Symbol变量：
    /*  let s1 = Symbol('wqw')
     let s2 = Symbol('wqw')
 
     console.log(s1 == s2); //false
     console.log(s1 === s2); //false
 
     let obj = { [Symbol('wqw')]: 1, [Symbol('wqw')]: 2 }
 
     obj[Symbol('wqw')] = 123123;
     console.log(obj); */
    // for (const k in obj) {
    //   console.log(k);  // 没有输出k
    // }

    // Object.getOwnPropertySymbols(obj),返回一个Symbol为Key的对象的key的集合。
    // console.log(Object.getOwnPropertySymbols(obj)); //[Symbol(wqw), Symbol(wqw)]
    /* 
        let arr = Object.getOwnPropertySymbols(obj);
        console.log(arr[0]);
        console.log(arr[1]);
        console.log(obj[arr[0]]);
        console.log(obj[arr[1]]);
    
        // 5. for of语句；循环遍历数组
        for (let k of arr) {
          // console.log(k); //Symbol(wqw)
          console.log(obj[k]); // 1,2,123123
        }
     */
    // 6 ：bigint ：BigInt 是一种内置对象，它提供了一种方法来表示大于 2^53 - 1 的整数。这原本是 Javascript 中可以用 Number 表示的最大数字。BigInt 可以表示任意大的整数。
    /* 
        const a = 10000n;
        const bigA = 10000n;
    
        console.log(typeof bigA);//bigint
    
        console.log(a * bigA); //100000000n , 计算时，都必须时bigint类型
     */

    //7. 有没有什么方法，可以准确判断除一个变量或值具体是什么数据类型？
    // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
    /*     console.log(Object.prototype.toString.call(1)); //[object Number]
        console.log(Object.prototype.toString.call("aaa")); //[object String]
        console.log(Object.prototype.toString.call(true)); //[object Boolean]
        console.log(Object.prototype.toString.call(null)); //[object Null]
        console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
        console.log(Object.prototype.toString.call([])); //[object Array]
        console.log(Object.prototype.toString.call({})); //[object Object]
        console.log(Object.prototype.toString.call(function () { })); //[object Function]
        let obj = { [Symbol('a')]: '1' }
        console.log(Object.prototype.toString.call(obj)); //[object Object]
        console.log(Object.prototype.toString.call(Symbol('a'))); //[object Symbol]
        console.log(Object.prototype.toString.call(new Date())); //[object Date]
        console.log(Object.prototype.toString.call(/\w/)); //[object RegExp]
    
    
        console.log(Object.prototype.toString.call(NaN)); //[object Number]
        console.log(Object.prototype.toString.call(12313n)); //[object BigInt]
        console.log(Object.prototype.toString.call(Math.PI)); //[object Number]
    
    
     */

    //8  顶层函数： Object , Function
    // 实例化对象的原型链上，有直接的构造函数对应的原型对象和顶层Object构造函数的原型对象
    console.log(new String('1') instanceof String);// true
    console.log(new Array() instanceof Array);  // true
    console.log(new Array() instanceof Object); // true

    // 把构造函数当对象看时，他们的原型链上有Function
    console.log(Array instanceof Function); // true
    console.log(Object instanceof Function); // true
    console.log(String instanceof Function); // true
    console.log(Function instanceof Function); // true

    // 实例化对象的原型链上没有Function
    console.log(new Array instanceof Function); //false
    console.log({} instanceof Function); //false




  </script>
</body>

</html>